import axios from "axios";
// 是否正在刷新的标记
let isRefreshing = false
// 重试队列，每一项将是一个待执行的函数形式
let requests = []
const instance = axios.create({
  baseURL: 'http://localhost:3000',
  timeout: 3000,
  headers: { 'X-Custom-Header': 'foobar' }
});

// 添加请求拦截器
axios.interceptors.request.use(
  (config) => {
    // cnofig配置对象,headers属性请求头,经常给服务器携带公共参数
    //返回配置对象
    // 在发送请求之前做些什么
    if (localStorage.getItem('AccessToken')) {
      config.headers.Authorization =
        'Bearer ' +
        JSON.parse(JSON.stringify(localStorage.getItem('AccessToken'))) || ''
    }
    // 返回配置对象
    return config
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
  },
);

// 添加响应拦截器
axios.interceptors.response.use(
  async (response) => {
    // 结构一层数据
    const dataAxios = response
    if (
      dataAxios.data.msg == '刷新令牌已过期' ||
      dataAxios.data.msg == '无效的刷新令牌'
    ) {
      ElMessage.error('登录凭证过期，请重新登陆') //错误信息
      localStorage.clear() // 删除缓存
      isRefreshing = false // 请求成功，开启刷新标识
      requests = [] // 置空
      userInfoStore.reset()
      router.push('/login')
      return false
    }
    // 无感刷新token
    if (dataAxios.data.code === 401) {
      if (!isRefreshing) {
        isRefreshing = true
        // 获取本地缓存中的RefreshToken
        const RefreshToken = localStorage.getItem('RefreshToken')
        // 请求新的token
        const res = await refreshToken(RefreshToken)
        // 请求成功，开启刷新标识
        isRefreshing = false
        localStorage.setItem('AccessToken', res.accessToken)
        localStorage.setItem('RefreshToken', res.refreshToken)
        // 已经刷新了token，将所有队列中的请求进行重试
        requests.forEach((item) => item(res?.accessToken))
        requests = []
      }
      return new Promise((resolve) => {
        // 将resolve放进队列，用一个函数形式来保存，等token刷新后直接执行
        requests.push((token) => {
          response.config.headers.Authorization = `Bearer ${token}`
          resolve(request(response.config)) //执行请求，
        })
      })
    }
    // 错误信息
    if (!dataAxios.data && dataAxios.data.code != 0) {
      ElMessage.error(dataAxios.data.msg)
    }
    return dataAxios.data
  },
);
export default instance;